{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "1fd97fa5-35c5-4318-94f8-2be0e04b8ed8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "import re\n",
    "import jieba\n",
    "from opencc import OpenCC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f51feb63-a6d4-409a-be42-0fb7df600667",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cuda')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43677da2-2850-420f-8270-1bf46db981ad",
   "metadata": {},
   "source": [
    "### 加载模型权重"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ada9af59-0e5a-4e55-8cae-f8cbff7b112f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\PC\\AppData\\Local\\Temp\\ipykernel_27444\\947385519.py:39: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  checkpoint = torch.load('../models/3_Chinese_Movie_review_Text_Classification/model_checkpoint.pth')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TextClassifier(\n",
       "  (embedding): Embedding(276419, 32, padding_idx=0)\n",
       "  (lstm): LSTM(32, 64, num_layers=2, batch_first=True, dropout=0.5, bidirectional=True)\n",
       "  (fc1): Linear(in_features=128, out_features=64, bias=True)\n",
       "  (fc2): Linear(in_features=64, out_features=2, bias=True)\n",
       "  (dropout): Dropout(p=0.5, inplace=False)\n",
       ")"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class TextClassifier(nn.Module):\n",
    "    def __init__(self, vocab_size, embedding_dim, embedding_matrix, hidden_dim=64):\n",
    "        super().__init__()\n",
    "        # 定义词嵌入层，使用 embedding_matrix 初始化\n",
    "        self.embedding = nn.Embedding.from_pretrained(\n",
    "            torch.FloatTensor(embedding_matrix),\n",
    "            padding_idx=0\n",
    "        )\n",
    "        self.embedding.weight.requires_grad = False # True 确保嵌入层的参数可训练\n",
    "        \"\"\"\n",
    "        双向 LSTM 层：输入维度为 embedding_dim，输出维度为 hidden_dim。\n",
    "        batch_first=True : 输入张量的形状为 (batch_size, sequence_length)。\n",
    "        bidirectional=True : LSTM 会在两个方向上（正向和反向）处理输入序列，以捕捉更多上下文信息\n",
    "        (因为 LSTM 是双向的，它的输出将是两个隐藏层的连接, 所以实际输出维度为 hidden_dim * 2)\n",
    "        \"\"\"\n",
    "        self.lstm = nn.LSTM(\n",
    "            embedding_dim,    # 输入特征的维度\n",
    "            hidden_dim,       # 隐藏状态的维度\n",
    "            num_layers=2,     # LSTM的层数\n",
    "            batch_first=True, # 输入和输出的张量的第一个维度是batch_size\n",
    "            bidirectional=True, # 使用双向LSTM\n",
    "            dropout=0.5\n",
    "        )\n",
    "        self.fc1 = nn.Linear(hidden_dim * 2, hidden_dim)  # 添加一个额外的全连接层\n",
    "        self.fc2 = nn.Linear(hidden_dim, 2)  # 二分类任务\n",
    "        self.dropout = nn.Dropout(0.5)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        embedded = self.embedding(x)\n",
    "        lstm_out, _ = self.lstm(embedded) # 第二个返回值_是LSTM的隐藏状态和单元状态；lstm_out形状： (batch_size, sequence_length, hidden_dim * 2)\n",
    "        last_hidden = lstm_out[:, -1, :] # 选择每个批次中的最后一个时刻的输出，形状为 (batch_size, hidden_dim * 2)\n",
    "        dropped = self.dropout(last_hidden)\n",
    "        fc1_out = F.relu(self.fc1(dropped))\n",
    "        fc_out = self.fc2(fc1_out)\n",
    "        return fc_out\n",
    "\n",
    "\n",
    "# 加载模型参数和权重\n",
    "checkpoint = torch.load('../models/3_Chinese_Movie_review_Text_Classification/model_checkpoint.pth')\n",
    "\n",
    "# 提取模型参数\n",
    "vocab_size = checkpoint['vocab_size']\n",
    "embedding_dim = checkpoint['embedding_dim']\n",
    "embedding_matrix = checkpoint['embedding_matrix']\n",
    "hidden_dim = checkpoint['hidden_dim']\n",
    "vocab = checkpoint['vocab']\n",
    "\n",
    "model = TextClassifier(vocab_size, embedding_dim, embedding_matrix, hidden_dim).to(device)\n",
    "\n",
    "# 加载模型权重\n",
    "model.load_state_dict(checkpoint['model_state_dict'])\n",
    "\n",
    "# 将模型设置为评估模式\n",
    "model.eval()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d07b117-d2bf-40b2-b4ed-15de2a1de02a",
   "metadata": {},
   "source": [
    "### 模型推理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "cdc305c5-1286-4f88-9599-a9e25f56ad40",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取停用词表\n",
    "with open('../datasets/chinese_movie_reviews/stopwords.txt', 'r', encoding='utf-8') as f:\n",
    "    stopwords = [line.strip() for line in f.readlines()]\n",
    "\n",
    "# 初始化 OpenCC 转换器（繁转简）\n",
    "cc = OpenCC('t2s')  # t2s 表示繁体转简体\n",
    "\n",
    "# 文本预处理函数\n",
    "def preprocess_text(text):\n",
    "    text = re.sub(r'\\d+', '', text)\n",
    "    text = cc.convert(text)\n",
    "    text = \" \".join(jieba.cut(text))\n",
    "    return \" \".join([word for word in text.split() if word not in stopwords])\n",
    "\n",
    "def word2vector(text, vocab, max_length=100):\n",
    "    words = text.split()\n",
    "    word_indices = [vocab.get(word, 0) for word in words]\n",
    "    if len(word_indices) < max_length:\n",
    "        word_indices += [0] * (max_length - len(word_indices))\n",
    "    else:\n",
    "        word_indices = word_indices[:max_length]\n",
    "    return torch.tensor([word_indices], dtype=torch.long)\n",
    "\n",
    "\n",
    "# 推理函数\n",
    "def predict_sentiment(text, model, vocab):\n",
    "    input_tensor = word2vector(text, vocab).to(device)\n",
    "    with torch.no_grad():\n",
    "        output = model(input_tensor)\n",
    "        predicted_class = torch.argmax(output, dim=1).item()\n",
    "    sentiment = 'positive' if predicted_class == 1 else 'negative'\n",
    "    return sentiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "1fa98604-c3a9-47d3-a8be-7d11bcafb8e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "分词后的文本：特别 喜欢 角色 进步 ！\n",
      "句子向量 : tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "         0, 0, 0, 0]])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'positive'"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "review = \"我特别喜欢这个角色进步！\"\n",
    "print(f'分词后的文本：{preprocess_text(review)}')\n",
    "print(f'句子向量 : {word2vector(review, vocab)}')\n",
    "predict_sentiment(review, model, vocab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "0f8d33ff-ef8c-41e4-9678-6642f8be260c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'<PAD>': 0,\n",
       " '看': 1,\n",
       " '人': 2,\n",
       " '但': 3,\n",
       " '好': 4,\n",
       " '这': 5,\n",
       " '还是': 6,\n",
       " '还': 7,\n",
       " '啊': 8,\n",
       " '故事': 9,\n",
       " '对': 10,\n",
       " '太': 11,\n",
       " '说': 12,\n",
       " '喜欢': 13,\n",
       " '得': 14,\n",
       " '能': 15,\n",
       " '没': 16,\n",
       " '剧情': 17,\n",
       " '真的': 18,\n",
       " '自己': 19,\n",
       " '中': 20,\n",
       " '不是': 21,\n",
       " '觉得': 22,\n",
       " '而': 23,\n",
       " '不错': 24,\n",
       " '会': 25,\n",
       " '一部': 26,\n",
       " '要': 27,\n",
       " '感觉': 28,\n",
       " '拍': 29,\n",
       " '更': 30,\n",
       " '这部': 31,\n",
       " '有点': 32,\n",
       " '着': 33,\n",
       " '导演': 34,\n",
       " '那': 35,\n",
       " '去': 36,\n",
       " '想': 37,\n",
       " '片子': 38,\n",
       " '挺': 39,\n",
       " '却': 40,\n",
       " '个': 41,\n",
       " '这种': 42,\n",
       " '好看': 43,\n",
       " '像': 44,\n",
       " '其实': 45,\n",
       " '为': 46,\n",
       " '我们': 47,\n",
       " '看到': 48,\n",
       " '爱': 49,\n",
       " '来': 50,\n",
       " '才': 51,\n",
       " '知道': 52,\n",
       " '真是': 53,\n",
       " '再': 54,\n",
       " '片': 55,\n",
       " '人物': 56,\n",
       " '还有': 57,\n",
       " '角色': 58,\n",
       " '小': 59,\n",
       " '吗': 60,\n",
       " '用': 61,\n",
       " '很多': 62,\n",
       " '影片': 63,\n",
       " '只是': 64,\n",
       " '一样': 65,\n",
       " '完全': 66,\n",
       " '镜头': 67,\n",
       " '结尾': 68,\n",
       " '现在': 69,\n",
       " '演员': 70,\n",
       " '完': 71,\n",
       " '真': 72,\n",
       " '世界': 73,\n",
       " '并': 74,\n",
       " '呢': 75,\n",
       " '一': 76,\n",
       " '死': 77,\n",
       " '为了': 78,\n",
       " '有些': 79,\n",
       " '开始': 80,\n",
       " '它': 81,\n",
       " '应该': 82,\n",
       " '情节': 83,\n",
       " '比较': 84,\n",
       " '实在': 85,\n",
       " '音乐': 86,\n",
       " '看过': 87,\n",
       " '戏': 88,\n",
       " '观众': 89,\n",
       " '时': 90,\n",
       " '只': 91,\n",
       " '过': 92,\n",
       " '出来': 93,\n",
       " '爱情': 94,\n",
       " '年': 95,\n",
       " '演技': 96,\n",
       " '结局': 97,\n",
       " '不能': 98,\n",
       " '作为': 99,\n",
       " '一种': 100,\n",
       " '点': 101,\n",
       " '节奏': 102,\n",
       " '表演': 103,\n",
       " '女主': 104,\n",
       " '画面': 105,\n",
       " '打': 106,\n",
       " '生活': 107,\n",
       " '动作': 108,\n",
       " '两个': 109,\n",
       " '美国': 110,\n",
       " '特别': 111,\n",
       " '问题': 112,\n",
       " '中国': 113,\n",
       " '主角': 114,\n",
       " '确实': 115,\n",
       " '真实': 116,\n",
       " '可爱': 117,\n",
       " '以及': 118,\n",
       " '部分': 119,\n",
       " '当': 120,\n",
       " '一起': 121,\n",
       " '笑': 122,\n",
       " '各种': 123,\n",
       " '之': 124,\n",
       " '出': 125,\n",
       " '作品': 126,\n",
       " '一般': 127,\n",
       " '本片': 128,\n",
       " '不会': 129,\n",
       " '风格': 130,\n",
       " '以为': 131,\n",
       " '男主': 132,\n",
       " '历史': 133,\n",
       " '讲': 134,\n",
       " '之后': 135,\n",
       " '于': 136,\n",
       " '以': 137,\n",
       " '演': 138,\n",
       " '战争': 139,\n",
       " '剧本': 140,\n",
       " '居然': 141,\n",
       " '叙事': 142,\n",
       " '里面': 143,\n",
       " '可惜': 144,\n",
       " '如此': 145,\n",
       " '经典': 146,\n",
       " '那些': 147,\n",
       " '题材': 148,\n",
       " '除了': 149,\n",
       " '精彩': 150,\n",
       " '场面': 151,\n",
       " '所有': 152,\n",
       " '老': 153,\n",
       " '女人': 154,\n",
       " '时代': 155,\n",
       " '时间': 156,\n",
       " '可': 157,\n",
       " '甚至': 158,\n",
       " '感': 159,\n",
       " '男人': 160,\n",
       " '地方': 161,\n",
       " '配乐': 162,\n",
       " '第一部': 163,\n",
       " '现实': 164,\n",
       " '起来': 165,\n",
       " '无法': 166,\n",
       " '系列': 167,\n",
       " '孩子': 168,\n",
       " '女性': 169,\n",
       " '那段': 170,\n",
       " '东西': 171,\n",
       " '成': 172,\n",
       " '设定': 173,\n",
       " '版': 174,\n",
       " '分': 175,\n",
       " '只能': 176,\n",
       " '简直': 177,\n",
       " '特效': 178,\n",
       " '成为': 179,\n",
       " '一次': 180,\n",
       " '场景': 181,\n",
       " '恐怖': 182,\n",
       " '人类': 183,\n",
       " '然后': 184,\n",
       " '发现': 185,\n",
       " '那种': 186,\n",
       " '台词': 187,\n",
       " '么': 188,\n",
       " '逼': 189,\n",
       " '结果': 190,\n",
       " '本身': 191,\n",
       " '不要': 192,\n",
       " '等': 193,\n",
       " '需要': 194,\n",
       " '一切': 195,\n",
       " '年代': 196,\n",
       " '美': 197,\n",
       " '尤其': 198,\n",
       " '动画': 199,\n",
       " '简单': 200,\n",
       " '男': 201,\n",
       " '出现': 202,\n",
       " '这些': 203,\n",
       " '感动': 204,\n",
       " '细节': 205,\n",
       " '表现': 206,\n",
       " '整个': 207,\n",
       " '人生': 208,\n",
       " '喜剧': 209,\n",
       " '一下': 210,\n",
       " '希望': 211,\n",
       " '整体': 212,\n",
       " '这是': 213,\n",
       " '原来': 214,\n",
       " '啥': 215,\n",
       " '不够': 216,\n",
       " '情感': 217,\n",
       " '竟然': 218,\n",
       " '哭': 219,\n",
       " '日本': 220,\n",
       " '算是': 221,\n",
       " '理解': 222,\n",
       " '几个': 223,\n",
       " '真正': 224,\n",
       " '个人': 225,\n",
       " '倒': 226,\n",
       " '来说': 227,\n",
       " '一定': 228,\n",
       " '值得': 229,\n",
       " '女': 230,\n",
       " '无聊': 231,\n",
       " '永远': 232,\n",
       " '后面': 233,\n",
       " '类型': 234,\n",
       " '设计': 235,\n",
       " '新': 236,\n",
       " '社会': 237,\n",
       " '印象': 238,\n",
       " '主题': 239,\n",
       " '小时': 240,\n",
       " '之前': 241,\n",
       " '恐怖片': 242,\n",
       " '终于': 243,\n",
       " '走': 244,\n",
       " '变成': 245,\n",
       " '英雄': 246,\n",
       " '每个': 247,\n",
       " '三星': 248,\n",
       " '好像': 249,\n",
       " '分钟': 250,\n",
       " '搞笑': 251,\n",
       " '依然': 252,\n",
       " '不如': 253,\n",
       " '编剧': 254,\n",
       " '适合': 255,\n",
       " '人性': 256,\n",
       " '当然': 257,\n",
       " '叫': 258,\n",
       " '感情': 259,\n",
       " '存在': 260,\n",
       " '关系': 261,\n",
       " '无': 262,\n",
       " '一场': 263,\n",
       " '之间': 264,\n",
       " '算': 265,\n",
       " '高': 266,\n",
       " '一段': 267,\n",
       " '有趣': 268,\n",
       " '剪辑': 269,\n",
       " '蛮': 270,\n",
       " '表达': 271,\n",
       " '式': 272,\n",
       " '而是': 273,\n",
       " '意义': 274,\n",
       " '懂': 275,\n",
       " '改编': 276,\n",
       " '当年': 277,\n",
       " '令人': 278,\n",
       " '方式': 279,\n",
       " '选择': 280,\n",
       " '反派': 281,\n",
       " '你们': 282,\n",
       " '逻辑': 283,\n",
       " '半': 284,\n",
       " '连': 285,\n",
       " '好莱坞': 286,\n",
       " '看着': 287,\n",
       " '小时候': 288,\n",
       " '最终': 289,\n",
       " '元素': 290,\n",
       " '唯一': 291,\n",
       " '找': 292,\n",
       " '几乎': 293,\n",
       " '大家': 294,\n",
       " '政治': 295,\n",
       " '直接': 296,\n",
       " '明显': 297,\n",
       " '最好': 298,\n",
       " '听': 299,\n",
       " '完美': 300,\n",
       " '期待': 301,\n",
       " '成功': 302,\n",
       " '效果': 303,\n",
       " '不同': 304,\n",
       " '总是': 305,\n",
       " '啦': 306,\n",
       " '吃': 307,\n",
       " '哈哈哈': 308,\n",
       " '没什么': 309,\n",
       " '全片': 310,\n",
       " '这片': 311,\n",
       " '惊喜': 312,\n",
       " '年轻': 313,\n",
       " '电影院': 314,\n",
       " '显得': 315,\n",
       " '的话': 316,\n",
       " '深刻': 317,\n",
       " '带': 318,\n",
       " '重要': 319,\n",
       " '过于': 320,\n",
       " '搞': 321,\n",
       " '写': 322,\n",
       " '后来': 323,\n",
       " '每': 324,\n",
       " '生命': 325,\n",
       " '青春': 326,\n",
       " '当时': 327,\n",
       " '视角': 328,\n",
       " '有意思': 329,\n",
       " '可是': 330,\n",
       " '开头': 331,\n",
       " '背景': 332,\n",
       " '到底': 333,\n",
       " '美好': 334,\n",
       " '制作': 335,\n",
       " '充满': 336,\n",
       " '过程': 337,\n",
       " '套路': 338,\n",
       " '摄影': 339,\n",
       " '第一次': 340,\n",
       " '相当': 341,\n",
       " '如何': 342,\n",
       " '像是': 343,\n",
       " '情绪': 344,\n",
       " '不少': 345,\n",
       " '想象': 346,\n",
       " '星': 347,\n",
       " '本来': 348,\n",
       " '明白': 349,\n",
       " '话': 350,\n",
       " '基本': 351,\n",
       " '果然': 352,\n",
       " '最大': 353,\n",
       " '处理': 354,\n",
       " '看看': 355,\n",
       " '记得': 356,\n",
       " '事': 357,\n",
       " '毫无': 358,\n",
       " '绝对': 359,\n",
       " '精神': 360,\n",
       " '反而': 361,\n",
       " '呀': 362,\n",
       " '差': 363,\n",
       " '亮点': 364,\n",
       " '没想到': 365,\n",
       " '内容': 366,\n",
       " '总': 367,\n",
       " '家庭': 368,\n",
       " '多少': 369,\n",
       " '原著': 370,\n",
       " '反转': 371,\n",
       " '前面': 372,\n",
       " '形象': 373,\n",
       " '另': 374,\n",
       " '突然': 375,\n",
       " '似乎': 376,\n",
       " '依旧': 377,\n",
       " '自我': 378,\n",
       " '拿': 379,\n",
       " '靠': 380,\n",
       " '是不是': 381,\n",
       " '塑造': 382,\n",
       " '嘛': 383,\n",
       " '想起': 384,\n",
       " '线': 385,\n",
       " '女主角': 386,\n",
       " '片中': 387,\n",
       " '香港': 388,\n",
       " '艺术': 389,\n",
       " '感受': 390,\n",
       " '游戏': 391,\n",
       " '氛围': 392,\n",
       " '容易': 393,\n",
       " '好听': 394,\n",
       " '杀': 395,\n",
       " '同时': 396,\n",
       " '三个': 397,\n",
       " '其': 398,\n",
       " '自由': 399,\n",
       " '来看': 400,\n",
       " '自然': 401,\n",
       " '韩国': 402,\n",
       " '不好': 403,\n",
       " '拍摄': 404,\n",
       " '玩': 405,\n",
       " '且': 406,\n",
       " '朋友': 407,\n",
       " '过去': 408,\n",
       " '回忆': 409,\n",
       " '空间': 410,\n",
       " '事件': 411,\n",
       " '该': 412,\n",
       " '失望': 413,\n",
       " '更好': 414,\n",
       " '观影': 415,\n",
       " '纪录片': 416,\n",
       " '所谓': 417,\n",
       " '暴力': 418,\n",
       " '意思': 419,\n",
       " '牛': 420,\n",
       " '不到': 421,\n",
       " '或': 422,\n",
       " '相信': 423,\n",
       " '别人': 424,\n",
       " '接受': 425,\n",
       " '哈哈': 426,\n",
       " '文化': 427,\n",
       " '脸': 428,\n",
       " '超级': 429,\n",
       " '加': 430,\n",
       " '有人': 431,\n",
       " '影响': 432,\n",
       " '震撼': 433,\n",
       " '是因为': 434,\n",
       " '如': 435,\n",
       " '展现': 436,\n",
       " '这里': 437,\n",
       " '漂亮': 438,\n",
       " '浪漫': 439,\n",
       " '形式': 440,\n",
       " '以后': 441,\n",
       " '一星': 442,\n",
       " '一句': 443,\n",
       " '不了': 444,\n",
       " '发生': 445,\n",
       " '比如': 446,\n",
       " '记忆': 447,\n",
       " '想要': 448,\n",
       " '今天': 449,\n",
       " '够': 450,\n",
       " '人们': 451,\n",
       " '这次': 452,\n",
       " '通过': 453,\n",
       " '老师': 454,\n",
       " '厉害': 455,\n",
       " '高潮': 456,\n",
       " '以前': 457,\n",
       " '属于': 458,\n",
       " '传统': 459,\n",
       " '内心': 460,\n",
       " '更加': 461,\n",
       " '致敬': 462,\n",
       " '毕竟': 463,\n",
       " '气质': 464,\n",
       " '五星': 465,\n",
       " '煽情': 466,\n",
       " '结束': 467,\n",
       " '才能': 468,\n",
       " '想到': 469,\n",
       " '则': 470,\n",
       " '桥段': 471,\n",
       " '成长': 472,\n",
       " '很棒': 473,\n",
       " '方面': 474,\n",
       " '整部': 475,\n",
       " '主要': 476,\n",
       " '快': 477,\n",
       " '鬼': 478,\n",
       " '同样': 479,\n",
       " '样子': 480,\n",
       " '声音': 481,\n",
       " '十分': 482,\n",
       " '打斗': 483,\n",
       " '悬疑': 484,\n",
       " '越': 485,\n",
       " '未来': 486,\n",
       " '根本': 487,\n",
       " '父亲': 488,\n",
       " '呈现': 489,\n",
       " '手法': 490,\n",
       " '男女': 491,\n",
       " '科幻': 492,\n",
       " '在于': 493,\n",
       " '味道': 494,\n",
       " '国家': 495,\n",
       " '事情': 496,\n",
       " '女儿': 497,\n",
       " '技术': 498,\n",
       " '名字': 499,\n",
       " '血腥': 500,\n",
       " '不行': 501,\n",
       " '心理': 502,\n",
       " '全程': 503,\n",
       " '讽刺': 504,\n",
       " '豆瓣': 505,\n",
       " '中间': 506,\n",
       " '梦': 507,\n",
       " '死亡': 508,\n",
       " '最佳': 509,\n",
       " '长': 510,\n",
       " '至少': 511,\n",
       " '魅力': 512,\n",
       " '不断': 513,\n",
       " '四星': 514,\n",
       " '经历': 515,\n",
       " '其中': 516,\n",
       " '尴尬': 517,\n",
       " '更是': 518,\n",
       " '主演': 519,\n",
       " '影像': 520,\n",
       " '反': 521,\n",
       " '完整': 522,\n",
       " '好多': 523,\n",
       " '惊艳': 524,\n",
       " '意外': 525,\n",
       " '刻意': 526,\n",
       " '烂': 527,\n",
       " '傻': 528,\n",
       " '越来越': 529,\n",
       " '找到': 530,\n",
       " '恶心': 531,\n",
       " '语言': 532,\n",
       " '小说': 533,\n",
       " '努力': 534,\n",
       " '惊悚': 535,\n",
       " '刻画': 536,\n",
       " '看来': 537,\n",
       " '开心': 538,\n",
       " '程度': 539,\n",
       " '男主角': 540,\n",
       " '出彩': 541,\n",
       " '化': 542,\n",
       " '结构': 543,\n",
       " '配音': 544,\n",
       " '少年': 545,\n",
       " '气氛': 546,\n",
       " '视觉': 547,\n",
       " '些': 548,\n",
       " '告诉': 549,\n",
       " '老套': 550,\n",
       " '大片': 551,\n",
       " '已': 552,\n",
       " '好好': 553,\n",
       " '带来': 554,\n",
       " '疯狂': 555,\n",
       " '梦想': 556,\n",
       " '拯救': 557,\n",
       " '警察': 558,\n",
       " '兄弟': 559,\n",
       " '一生': 560,\n",
       " '歌舞': 561,\n",
       " '导致': 562,\n",
       " '感人': 563,\n",
       " '难得': 564,\n",
       " '继续': 565,\n",
       " '母亲': 566,\n",
       " '改变': 567,\n",
       " '后半段': 568,\n",
       " '还要': 569,\n",
       " '水平': 570,\n",
       " '哦': 571,\n",
       " '强': 572,\n",
       " '肯定': 573,\n",
       " '能力': 574,\n",
       " '片尾': 575,\n",
       " '情怀': 576,\n",
       " '发展': 577,\n",
       " '主旋律': 578,\n",
       " '力量': 579,\n",
       " '色彩': 580,\n",
       " '版本': 581,\n",
       " '残酷': 582,\n",
       " '相比': 583,\n",
       " '儿子': 584,\n",
       " '足够': 585,\n",
       " '水准': 586,\n",
       " '讲述': 587,\n",
       " '心': 588,\n",
       " '创意': 589,\n",
       " '歌': 590,\n",
       " '看起来': 591,\n",
       " '能够': 592,\n",
       " '角度': 593,\n",
       " '伟大': 594,\n",
       " '性': 595,\n",
       " '之一': 596,\n",
       " '悲剧': 597,\n",
       " '女孩': 598,\n",
       " '杀人': 599,\n",
       " '面对': 600,\n",
       " '了解': 601,\n",
       " '戏份': 602,\n",
       " '完成': 603,\n",
       " '第二部': 604,\n",
       " '字幕': 605,\n",
       " '梗': 606,\n",
       " '铺垫': 607,\n",
       " '吸引': 608,\n",
       " '黑': 609,\n",
       " '僵尸': 610,\n",
       " '一群': 611,\n",
       " '续集': 612,\n",
       " '童年': 613,\n",
       " '站': 614,\n",
       " '下来': 615,\n",
       " '原因': 616,\n",
       " '莫名其妙': 617,\n",
       " '造型': 618,\n",
       " '的确': 619,\n",
       " '俗套': 620,\n",
       " '就算': 621,\n",
       " '由': 622,\n",
       " '妈妈': 623,\n",
       " '命运': 624,\n",
       " '影院': 625,\n",
       " '眼睛': 626,\n",
       " '刺激': 627,\n",
       " '者': 628,\n",
       " '推荐': 629,\n",
       " '类似': 630,\n",
       " '幽默': 631,\n",
       " '到位': 632,\n",
       " '黑暗': 633,\n",
       " '宗教': 634,\n",
       " '必须': 635,\n",
       " '跑': 636,\n",
       " '美丽': 637,\n",
       " '起': 638,\n",
       " '明明': 639,\n",
       " '评分': 640,\n",
       " '不想': 641,\n",
       " '变得': 642,\n",
       " '文艺': 643,\n",
       " '宇宙': 644,\n",
       " '身上': 645,\n",
       " '本': 646,\n",
       " '岁': 647,\n",
       " '前半段': 648,\n",
       " '身份': 649,\n",
       " '纯粹': 650,\n",
       " '唱': 651,\n",
       " '此片': 652,\n",
       " '国产': 653,\n",
       " '既': 654,\n",
       " '遗憾': 655,\n",
       " '欲望': 656,\n",
       " '可怕': 657,\n",
       " '平庸': 658,\n",
       " '认为': 659,\n",
       " '段落': 660,\n",
       " '武侠': 661,\n",
       " '复仇': 662,\n",
       " '男性': 663,\n",
       " '拖沓': 664,\n",
       " '童话': 665,\n",
       " '营造': 666,\n",
       " '复杂': 667,\n",
       " '难': 668,\n",
       " '不再': 669,\n",
       " '帅': 670,\n",
       " '真心': 671,\n",
       " '低': 672,\n",
       " '黑人': 673,\n",
       " '掉': 674,\n",
       " '少女': 675,\n",
       " '体验': 676,\n",
       " '小孩': 677,\n",
       " '冲突': 678,\n",
       " '不得不': 679,\n",
       " '片段': 680,\n",
       " '钱': 681,\n",
       " '今年': 682,\n",
       " '环境': 683,\n",
       " '要是': 684,\n",
       " '紧张': 685,\n",
       " '仿佛': 686,\n",
       " '西部片': 687,\n",
       " '一遍': 688,\n",
       " '请': 689,\n",
       " '狗血': 690,\n",
       " '想象力': 691,\n",
       " '做到': 692,\n",
       " '仍然': 693,\n",
       " '多么': 694,\n",
       " '多年': 695,\n",
       " '下去': 696,\n",
       " '灵魂': 697,\n",
       " '有种': 698,\n",
       " '烂片': 699,\n",
       " '观看': 700,\n",
       " '混乱': 701,\n",
       " '思考': 702,\n",
       " '真相': 703,\n",
       " '放在': 704,\n",
       " '跳': 705,\n",
       " '出色': 706,\n",
       " '追求': 707,\n",
       " '欢乐': 708,\n",
       " '舞台': 709,\n",
       " '太多': 710,\n",
       " '牺牲': 711,\n",
       " '讨厌': 712,\n",
       " '励志': 713,\n",
       " '于是': 714,\n",
       " '棒': 715,\n",
       " '奇怪': 716,\n",
       " '观感': 717,\n",
       " '优秀': 718,\n",
       " '典型': 719,\n",
       " '还好': 720,\n",
       " '仍': 721,\n",
       " '动人': 722,\n",
       " '流畅': 723,\n",
       " '而已': 724,\n",
       " '痛苦': 725,\n",
       " '新意': 726,\n",
       " '非': 727,\n",
       " '三': 728,\n",
       " '银幕': 729,\n",
       " '孤独': 730,\n",
       " '动物': 731,\n",
       " '恐惧': 732,\n",
       " '看得': 733,\n",
       " '一边': 734,\n",
       " '隐喻': 735,\n",
       " '上映': 736,\n",
       " '始终': 737,\n",
       " '身体': 738,\n",
       " '公主': 739,\n",
       " '变': 740,\n",
       " '商业': 741,\n",
       " '过瘾': 742,\n",
       " '总体': 743,\n",
       " '一颗': 744,\n",
       " '普通': 745,\n",
       " '结合': 746,\n",
       " '两部': 747,\n",
       " '幸福': 748,\n",
       " '印度': 749,\n",
       " '性格': 750,\n",
       " '紧凑': 751,\n",
       " '狗': 752,\n",
       " '见': 753,\n",
       " '设置': 754,\n",
       " '现代': 755,\n",
       " '动作片': 756,\n",
       " '评价': 757,\n",
       " '之作': 758,\n",
       " '彩蛋': 759,\n",
       " '缺乏': 760,\n",
       " '行': 761,\n",
       " '难看': 762,\n",
       " '很大': 763,\n",
       " '强大': 764,\n",
       " '笑点': 765,\n",
       " '必要': 766,\n",
       " '好笑': 767,\n",
       " '代表': 768,\n",
       " '回到': 769,\n",
       " '每次': 770,\n",
       " '舞蹈': 771,\n",
       " '失败': 772,\n",
       " '估计': 773,\n",
       " '不用': 774,\n",
       " '拥有': 775,\n",
       " '之外': 776,\n",
       " '表情': 777,\n",
       " '背后': 778,\n",
       " '调度': 779,\n",
       " '配角': 780,\n",
       " '正义': 781,\n",
       " '吓': 782,\n",
       " '迪士尼': 783,\n",
       " '不算': 784,\n",
       " '放': 785,\n",
       " '哪': 786,\n",
       " '对比': 787,\n",
       " '神': 788,\n",
       " '矛盾': 789,\n",
       " '人家': 790,\n",
       " '一半': 791,\n",
       " '压抑': 792,\n",
       " '奥斯卡': 793,\n",
       " '坚持': 794,\n",
       " '美女': 795,\n",
       " '彻底': 796,\n",
       " '温情': 797,\n",
       " '穿越': 798,\n",
       " '内': 799,\n",
       " '却是': 800,\n",
       " '细腻': 801,\n",
       " '变态': 802,\n",
       " '不知': 803,\n",
       " '夸张': 804,\n",
       " '比起': 805,\n",
       " '想法': 806,\n",
       " '演绎': 807,\n",
       " '一幕': 808,\n",
       " '第一': 809,\n",
       " '大量': 810,\n",
       " '留下': 811,\n",
       " '拉': 812,\n",
       " '法国': 813,\n",
       " '长大': 814,\n",
       " '大战': 815,\n",
       " '全部': 816,\n",
       " '不仅': 817,\n",
       " '状态': 818,\n",
       " '大叔': 819,\n",
       " '时刻': 820,\n",
       " '两人': 821,\n",
       " '反正': 822,\n",
       " '还原': 823,\n",
       " '心里': 824,\n",
       " '部': 825,\n",
       " '精致': 826,\n",
       " '质感': 827,\n",
       " '出场': 828,\n",
       " '绝望': 829,\n",
       " '再次': 830,\n",
       " '华丽': 831,\n",
       " '如今': 832,\n",
       " '行为': 833,\n",
       " '放弃': 834,\n",
       " '十足': 835,\n",
       " '那里': 836,\n",
       " '评论': 837,\n",
       " '西部': 838,\n",
       " '救': 839,\n",
       " '拍出': 840,\n",
       " '回来': 841,\n",
       " '进入': 842,\n",
       " '动画片': 843,\n",
       " '正': 844,\n",
       " '穿': 845,\n",
       " '成龙': 846,\n",
       " '剧': 847,\n",
       " '快乐': 848,\n",
       " '开场': 849,\n",
       " '般的': 850,\n",
       " '间': 851,\n",
       " '来自': 852,\n",
       " '生硬': 853,\n",
       " '对话': 854,\n",
       " '熟悉': 855,\n",
       " '解释': 856,\n",
       " '戏剧': 857,\n",
       " '意识': 858,\n",
       " '别': 859,\n",
       " '进行': 860,\n",
       " '演出': 861,\n",
       " '概念': 862,\n",
       " '差点': 863,\n",
       " '港片': 864,\n",
       " '两位': 865,\n",
       " '二': 866,\n",
       " '难以': 867,\n",
       " '创作': 868,\n",
       " '还行': 869,\n",
       " '吓人': 870,\n",
       " '犯罪': 871,\n",
       " '平淡': 872,\n",
       " '离开': 873,\n",
       " '粉丝': 874,\n",
       " '猜': 875,\n",
       " '欣赏': 876,\n",
       " '拍得': 877,\n",
       " '杀手': 878,\n",
       " '看出': 879,\n",
       " '展示': 880,\n",
       " '符合': 881,\n",
       " '英国': 882,\n",
       " '最近': 883,\n",
       " '产生': 884,\n",
       " '重新': 885,\n",
       " '中规中矩': 886,\n",
       " '丰富': 887,\n",
       " '票房': 888,\n",
       " '包括': 889,\n",
       " '粗糙': 890,\n",
       " '段': 891,\n",
       " '飞机': 892,\n",
       " '强行': 893,\n",
       " '明星': 894,\n",
       " '怪物': 895,\n",
       " '太过': 896,\n",
       " '赞': 897,\n",
       " '幻想': 898,\n",
       " '使': 899,\n",
       " '爸爸': 900,\n",
       " '遇到': 901,\n",
       " '战斗': 902,\n",
       " '路': 903,\n",
       " '灾难': 904,\n",
       " '单纯': 905,\n",
       " '浪费': 906,\n",
       " '时期': 907,\n",
       " '妈': 908,\n",
       " '走向': 909,\n",
       " '俩': 910,\n",
       " '荒诞': 911,\n",
       " '画风': 912,\n",
       " '强烈': 913,\n",
       " '忘': 914,\n",
       " '略': 915,\n",
       " '温暖': 916,\n",
       " '信仰': 917,\n",
       " '国内': 918,\n",
       " '超': 919,\n",
       " '一天': 920,\n",
       " '哈哈哈哈': 921,\n",
       " '满足': 922,\n",
       " '老婆': 923,\n",
       " '不太': 924,\n",
       " '城市': 925,\n",
       " '啊啊啊': 926,\n",
       " '感到': 927,\n",
       " '决定': 928,\n",
       " '眼神': 929,\n",
       " '愿意': 930,\n",
       " '发挥': 931,\n",
       " '打动': 932,\n",
       " '正确': 933,\n",
       " '所有人': 934,\n",
       " '主线': 935,\n",
       " '上帝': 936,\n",
       " '月': 937,\n",
       " '瞬间': 938,\n",
       " '控制': 939,\n",
       " '用心': 940,\n",
       " '不足': 941,\n",
       " '漫画': 942,\n",
       " '看似': 943,\n",
       " '体现': 944,\n",
       " '因': 945,\n",
       " '正常': 946,\n",
       " '面前': 947,\n",
       " '地球': 948,\n",
       " '人设': 949,\n",
       " '弱': 950,\n",
       " '便': 951,\n",
       " '道': 952,\n",
       " '功夫': 953,\n",
       " '价值': 954,\n",
       " '妻子': 955,\n",
       " '视听': 956,\n",
       " '小女孩': 957,\n",
       " '亦': 958,\n",
       " '演得': 959,\n",
       " '加入': 960,\n",
       " '有着': 961,\n",
       " '哥哥': 962,\n",
       " '人民': 963,\n",
       " '标准': 964,\n",
       " '工作': 965,\n",
       " '很难': 966,\n",
       " '假': 967,\n",
       " '善良': 968,\n",
       " '不可': 969,\n",
       " '冗长': 970,\n",
       " '类': 971,\n",
       " '模式': 972,\n",
       " '也好': 973,\n",
       " '长镜头': 974,\n",
       " '轻松': 975,\n",
       " '开': 976,\n",
       " '美的': 977,\n",
       " '刚': 978,\n",
       " '悬念': 979,\n",
       " '天': 980,\n",
       " '重点': 981,\n",
       " '猫': 982,\n",
       " '歌舞片': 983,\n",
       " '清楚': 984,\n",
       " '看见': 985,\n",
       " '超越': 986,\n",
       " '成熟': 987,\n",
       " '怀疑': 988,\n",
       " '机会': 989,\n",
       " '处': 990,\n",
       " '电视': 991,\n",
       " '无比': 992,\n",
       " '天才': 993,\n",
       " '深度': 994,\n",
       " '心中': 995,\n",
       " '神奇': 996,\n",
       " '传奇': 997,\n",
       " '内核': 998,\n",
       " '进步': 999,\n",
       " ...}"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "592d8098-f44e-4d6d-8a46-c79300734aac",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
